#include "fenetreopengl.h"


//--------------------- Constructeurs et destructeur -------------------
/* ****************************************************************
 * Constructeur de la fenetre
 * @param framePerSecond : temps de rafraichissement de
                           la fenetre (images par seconde)
 * @param parent : QWidget parent de cette fenêtre
 * @param name : nom de la fenetre
 * **************************************************************** */
FenetreOpengl::FenetreOpengl(int framesPerSecond, QWidget *parent, char *name)
    : QGLWidget(parent)
{
    //On initialise la caméra
    _camera = new Camera();

    //On donne un titre à la fenêtre
    setWindowTitle(QString::fromUtf8(name));

    //On définit notre timer pour le rafraichissement de notre fenêtre
    if(framesPerSecond == 0)
        _timer = NULL;
    else
    {
        int seconde = 1000; // 1 seconde = 1000 ms
        int intervale = seconde / framesPerSecond;
        _timer = new QTimer(this);
        //connect(_timer, SIGNAL(timeout()), this, SLOT(timeOutSlot()));
        _timer->start(intervale);
    }
}

/* ****************************************************************
 * Destructeur de la fenetre
 * **************************************************************** */
FenetreOpengl::~FenetreOpengl()
{
    delete _timer;
    delete _camera;
}

//----------------------------------------------------------------------
//--------------------- Méthodes ---------------------------------------

/* ****************************************************************
 * Fonction permettant d'initialiser notre fenetre opengl
 * **************************************************************** */
void FenetreOpengl::initializeGL()
{
    glShadeModel(GL_SMOOTH);
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glClearDepth(1.0f);
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
}

/* ****************************************************************
 * Fonction permettant de redimensionner correctement
 * notre fenêtre opengl
 * @param width : nouvelle longueur de la fenêtre
 * @param height : nouvelle hauteur de la hauteur
 * **************************************************************** */
void FenetreOpengl::resizeGL(int width, int height)
{
    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45.0f, (GLfloat)width/(GLfloat)height, 0.1f, 100.0f);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

/* ****************************************************************
 * Fonction de dessin
 * **************************************************************** */
void FenetreOpengl::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();

    //TODO : PLACER LA CAMERA ICI
    _camera->utiliser();


    glPushMatrix();
        glColor3f(0.8, 0.2, 0.2);
        glRotatef(60, 1.0, 1.0, 0.0);
        glBegin(GL_QUADS);
            //devant
            glNormal3f(0.0, 0.0, 1.0);
            glVertex3f(-1.0,-1.0,-1.0);
            glVertex3f(1.0,-1.0,-1.0);
            glVertex3f(1.0,1.0,-1.0);
            glVertex3f(-1.0,1.0,-1.0);

            //derriere
            glNormal3f(0.0, 0.0, -1.0);
            glVertex3f(-1.0,-1.0,1.0);
            glVertex3f(1.0,-1.0,1.0);
            glVertex3f(1.0,1.0,1.0);
            glVertex3f(-1.0,1.0,1.0);

            //gauche
            glNormal3f(1.0, 0.0, 0.0);
            glVertex3f(-1.0,-1.0,-1.0);
            glVertex3f(-1.0,1.0,-1.0);
            glVertex3f(-1.0,1.0,1.0);
            glVertex3f(-1.0,-1.0,1.0);

            //droite
            glNormal3f(-1.0, 0.0, 0.0);
            glVertex3f(1.0,-1.0,-1.0);
            glVertex3f(1.0,1.0,-1.0);
            glVertex3f(1.0,1.0,1.0);
            glVertex3f(1.0,-1.0,1.0);

            //dessus
            glNormal3f(0.0, -1.0, 0.0);
            glVertex3f(-1.0,1.0,-1.0);
            glVertex3f(1.0,1.0,-1.0);
            glVertex3f(1.0,1.0,1.0);
            glVertex3f(-1.0,1.0,1.0);

            //dessous
            glNormal3f(0.0, 1.0, 0.0);
            glVertex3f(-1.0,-1.0,-1.0);
            glVertex3f(1.0,-1.0,-1.0);
            glVertex3f(1.0,-1.0,1.0);
            glVertex3f(-1.0,-1.0,1.0);

        glEnd();
    glPopMatrix();
}

/* ****************************************************************
 * Fonction récupérant l'évènement de l'appuie d'une touche sur le clavier
 * @param keyEvent : touche pressée
 * **************************************************************** */
void FenetreOpengl::keyPressEvent( QKeyEvent *keyEvent )
{


}

//----------------------------------------------------------------------

//--------------------- Slots  -----------------------------------------

/* ****************************************************************
 * Slot permettant de récupérer l'évènement du timer pour rafraichir la fenetre
 * **************************************************************** */
void FenetreOpengl::timerTermine()
{
    updateGL();
}

//----------------------------------------------------------------------

//--------------------- Accesseurs -------------------------------------

//----------------------------------------------------------------------
//--------------------- Surcharge des opérateurs -----------------------

//----------------------------------------------------------------------


